"""
    02.异常的处理
    try:       # 测试body函数体
        body
    except Exception:   # 捕捉异常，Exception是异常类型，如果不接类型则捕捉所有异常
        continue
    # TypeError NameError
    # 异常信息可以用as储存到变量中 except Exception as i:
    # 可以用if-else 设置多个异常捕捉，或者把异常类型括起来
    # except (TypeError, NameError):
    finally:
        statements
    # finally 不管是否出现异常都会执行
    #  注意，捕捉只能捕捉try中的异常

    主动抛出异常
"""

异常的处理
i. try—except—except—finally—else(无异常)

# ValueError 异常
try:
    语句块
except ValueError as e:
    print(e.args)

# 如果不确定异常的类型
try:
    语句块
except Exception as e:
    print(e.args)

f = open("path.txt", "r")
try:
    f.read()
except ValueError as e:
    print("Value Error found!  ", e.args)
    # 这里 处理了首次发现的ValueError 异常  并且
    # 继续将改异常抛出到上一个调用层进行处理，以此往复如果直到最顶层的调用方都没有处理 则程序崩溃
    raise
except TypeError as e:
    print("Type Error found!  ", e.args)
except (SyntaxError, NameError) as e:
    # 一次捕获两种异常
    print("语法错误 或 名称错误！", e.args)
finally:
    # 后续处理 
    f.close()
    print("Final body")
else:
    # 如果 try---except---没有出现异常  
    print("No Error!")


如何自定义异常


class MyError(Exception):
    def __init__(self, value="Default Error"):
        self.value = value

    def __str__(self):
        return repr(self.value)


自定义异常的处理
a = 'yyy'
if a == 'xxx':  # 决定异常判断条件
    raise MyError('自定义异常信息')
